package com.browsesoft.baseadapter;

import java.util.Hashtable;
import java.util.LinkedList;

import javax.servlet.http.HttpServletRequest;

import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import com.browsesoft.ExtendElement;
import com.browsesoft.htmlcomponent.HTMLBasicComponent;
import com.browsesoft.htmlcomponent.HTMLLazyTable;
import com.browsesoft.htmlcomponent.HTMLTableComponent;
import com.browsesoft.htmlcomponent.HTMLTableModel;
import com.browsesoft.workflow.support.sortInterface;

/**
 * 不带翻页的表组件 表格带分类，表头不带分类，行不带分类
 * 
 * @author Browsesoft
 * @version 1.0
 */
public class HTMLTableComponentAdapter extends HTMLTableComponent {
	// 保存表头行元素
	protected Element tableHeadElement = null;

	// 保存表体行元素
	// protected Element tableLineElement = null;
	protected LinkedList rowType = new LinkedList();

	/**
	 * 构造器
	 * 
	 * @param parent
	 *            组件的父组件
	 * @throws Exception
	 */
	public HTMLTableComponentAdapter(HTMLBasicComponent parent)
			throws Exception {
		super(parent);
	}

	/**
	 * 初始化时
	 * 
	 * @param request
	 *            e
	 * @param e
	 *            e
	 * @throws Exception
	 */
	public void init(HttpServletRequest request, Element e) throws Exception {
		// 创建子组件并保存组件元素
		super.init(request, e);
		// 克隆element中的表头行元素
		tableHeadElement = (Element) ((Element) ExtendElement.findElements(
				element, "type", "head").get(0)).cloneNode(true);
		int trCount = ExtendElement.findElements(element, "type", "tr").size();
		// 对于每行
		for (int i = 0; i < trCount; i++) {
			// 克隆每行
			Element tableLineElement = (Element) ((Element) ExtendElement
					.findElements(element, "type", "tr").get(i))
					.cloneNode(true);
			rowType.add(tableLineElement);
		}
		// 对于每行
		for (int i = 0; i < rowType.size(); i++) {
			Element tableLineElement = (Element) rowType.get(i);
			LinkedList list = ExtendElement.findElements(tableLineElement,
					"type", "check");
			// 如果有check框元素
			if (list.size() > 0) {
				Element tdElement = (Element) list.get(0);
				// 找到该元素中有choice="true"的元素
				Element ele = (Element) ExtendElement.findElements(tdElement,
						"choice", "true").get(0);
				// 找到该元素的onclick属性值
				String onclick = (String) ele.getAttribute("onclick");
				// 重新设置该属性值
				onclick = onclick.replaceAll("resultdarpent", "resultdarpent"
						+ "_" + this.name);
				// 替换onclick的属性值
				ele.setAttribute("onclick", onclick);
			}
		}
		// 处理查询按钮
		createSearch();
	}

	/**
	 * 构造表头
	 */
	protected void createTableHead() {
		// 读入表头
		Element tr = (Element) ExtendElement.findElements(element, "type",
				"head").get(0);
		// 得到表头template结点
		Element template = (Element) tr.getElementsByTagName("template")
				.item(0);
		if (model != null) {
			for (int j = 0; j < ((HTMLTableModel) model).getColumnCount(); j++) {
				// 从tableHeadElement属性中得到列的类型，复制列
				Element tdElement = (Element) ExtendElement.findElements(
						tableHeadElement, "type", "td").get(0);
				// 添加新的表格元素
				Element td = (Element) tdElement.cloneNode(true);
				template.appendChild(td);
				// model是可排序
				if (this.model instanceof sortInterface) {
					try {
						String temp = ((HTMLTableModel) model).getColumnName(j);
						// 给该列加链接
						Element link = this.getPage().getDocument()
								.createElement("a");
						link.setAttribute("href", "page.jsp?" + this.name
								+ ".sort=" + this.model.getClass().getName()
								+ j + "&pagename=" + this.getPage().getName());
						ExtendElement.replaceElementContext(td, link);
						Node text = this.getPage().getDocument()
								.createTextNode(temp);
						link.appendChild(text);
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
				// 用实际字段名称替换模板
				else {
					ExtendElement.replaceElementContext(td, this.getPage()
							.getDocument().createTextNode(
									((HTMLTableModel) model).getColumnName(j)));
				}
			}
			// 得到表头template结点
			Element headElement = (Element) tableHeadElement.cloneNode(true);
			// 从hard属性中得到列的类型，复制列
			Element tdElement = (Element) ExtendElement.findElements(
					headElement, "type", "td").get(0);
			// 删除类型不是type＝td的元素
			tdElement.getParentNode().removeChild(tdElement);
			// 类型不为td的集合
			NodeList nl = headElement.getElementsByTagName("td");
			// 对于每个不是type＝td的元素
			for (int i = 0; i < nl.getLength(); i++) {
				Element td = (Element) nl.item(i).cloneNode(true);
				template.appendChild(td);
			}
		}
	}

	/**
	 * 构造行元素
	 * 
	 * @param start
	 *            起始行数
	 * @param end
	 *            结束行数
	 */
	protected void createTableRows(int start, int end) {
		// 如果model属于根据需要加载对象的类型
		if (model instanceof HTMLLazyTable) {
			// 让model加载对象
			HTMLLazyTable lazy = (HTMLLazyTable) model;
			lazy.loadData(start, end);
		}
		// 读入element的表体元素(tablebody)
		Element tablebody = (Element) element.getElementsByTagName("tablebody")
				.item(0);
		// 构造需要显示的行元素
		int count = ((HTMLTableModel) model).getRowCount();
		for (int i = start; i < end && i < count; i++) {
			// 行类型数
			int k = rowType.size();
			// 得到行的类型
			Element tableLineElement = (Element) ((Element) rowType.get(i % k))
					.cloneNode(true);
			// 复制行元素
			Element tr = (Element) tableLineElement.cloneNode(true);
			// 清空template下的子结点
			ExtendElement.removeNodes(tr, "template");
			// 添加行元素到element行元素的父元素下
			tablebody.appendChild(tr);
			// 每一列
			int j = 0;
			for (; j < ((HTMLTableModel) model).getColumnCount(); j++) {
				// 从tableLineElement属性中得到列类型
				Element tdElement = (Element) ExtendElement.findElements(
						tableLineElement, "type", "td").get(0);
				// 克隆新的表格元素
				Element td = (Element) tdElement.cloneNode(true);
				// 给tr的template元素增加列
				((Element) tr.getElementsByTagName("template").item(0))
						.appendChild(td);
				// 模型修改表格单元
				((HTMLTableModel) model).modifyCellValue(td, this.getPage()
						.getDocument(), i, j);
			}
			// 得到第一种行的类型
			Element tableBodyElement = (Element) ((Element) rowType.get(i % k))
					.cloneNode(true);
			// 取所有td
			Element td = (Element) ExtendElement.findElements(tableBodyElement,
					"type", "td").get(0);
			td.getParentNode().removeChild(td);
			NodeList ls = tableBodyElement.getElementsByTagName("td");
			for (int n = 0; n < ls.getLength(); n++) {
				Element tdE = (Element) ls.item(n).cloneNode(true);
				// 追加td
				((Element) tr.getElementsByTagName("template").item(0))
						.appendChild(tdE);
				// 修改td中的值
				((HTMLTableModel) model).modifyCellValue(tdE, this.getPage()
						.getDocument(), i, n + j);
			}
		}
	}

	/**
	 * 设置条件
	 * 
	 * @param condition
	 *            条件
	 */
	public void setCondition(Hashtable condition) {
		((HTMLTableModelAdapter) this.model).setCondition(condition);
	}
}